package ioex

import (
	"errors"
	"io"
	"io/ioutil"
	"os"
	"path"
	"strings"
)

/*
复制文件
	params:
		src: 源文件
		dst: 目标文件
	returns:
		written: 写入文件大小
		err: 错误信息
*/
func CopyFile(src, dst string) (written int64, err error) {
	fsrc, err := os.Open(src)
	if err != nil {
		return
	}
	defer fsrc.Close()
	fdst, err := os.OpenFile(dst, os.O_WRONLY|os.O_CREATE, 0755)
	if err != nil {
		return
	}
	defer fdst.Close()
	return io.Copy(fdst, fsrc)
}

/*
文件或路径是否存在
	params:
		path: 路径或者文件地址
	returns:
		b: true -> 存在
*/
func Exist(src string) (b bool) {
	if _, err := os.Stat(src); err != nil {
		return false
	}
	return true
}

/*
是否为路径
	params:
		path: 路径
	returns:
		b: true -> 代表是路径
*/
func IsDir(path string) (b bool) {
	info, err := os.Stat(path)
	if err != nil {
		return false
	} else {
		return info.IsDir()
	}
}

/*
复制目录 (单层COPY)
	params:
		src: 源路径
		dst: 目标路径
	returns:
		count: 复制文件数量
		err: 错误信息
*/
func CopyFolderFiles(src, dst string) (err error) {

	// 检测源是否存在
	if !Exist(src) {
		return errors.New("源不存在")
	}

	// 检测源是不是文件夹
	if !IsDir(src) {
		return errors.New("源不是文件夹")
	}

	// 检测目标是否存在
	if Exist(dst) {
		return errors.New("目标已经存在")
	}

	if err := os.MkdirAll(dst, 0755); err != nil {
		return err
	}

	files, err := ListFiles(src, "")

	for _, file := range files {
		if _, err := CopyFile(path.Join(src, file), path.Join(dst, file)); err != nil {
			os.RemoveAll(dst)
			return err
		}
	}

	return
}

/*
列目录文件, 仅仅查询文件
	params:
		folder_path: 目录路径
		suffix: 过滤
	returns:
		files: 文件列表
		err: 错误信息
*/
func ListFiles(folder_path string, suffix string) (files []string, err error) {
	files = make([]string, 0, 10)

	folder, err := ioutil.ReadDir(folder_path)
	if err != nil {
		return nil, err
	}

	suffix = strings.ToUpper(suffix) //忽略后缀匹配的大小写

	for _, fi := range folder {
		if fi.IsDir() { // 忽略目录
			continue
		}
		if strings.HasSuffix(strings.ToUpper(fi.Name()), suffix) { //匹配文件
			files = append(files, fi.Name())
		}
	}
	return files, nil
}

/*
列目录下的扩展名
	params:
		folder_path: 文件夹
	returns:
		extensions: 扩展名数组
		err: error message
*/
func ListExtensions(folder_path string) (extensions []string, err error) {

	files, err := ListFiles(folder_path, "")

	for _, file := range files {
		ext := path.Ext(file)
		b := false
		for i := range extensions {
			if ext == extensions[i] {
				b = true
			}
		}
		if !b {
			extensions = append(extensions, ext)
		}
	}

	return
}
